home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / a_utils / perl / cterm.lha / edit.c < prev    next >
C/C++ Source or Header  |  1993-08-13  |  5KB  |  261 lines

  1. #include <curses.h>
  2. #include "cursesXt.h"
  3. #include <stdio.h>
  4. #include <ctype.h>
  5. #include <string.h>
  6. #include "defs.h"
  7.  
  8. #ifndef BEEP
  9. #define BEEP nobeep
  10. #endif
  11.  
  12. static int Erase = 0, Kill = 0, initialized = 0 ;
  13. static int quitEdit[MAXQUITEDIT], quitEditSize = 0 ;
  14. static int leftEdit[MAXQUITEDIT], leftEditSize = 0 ;
  15. static int rightEdit[MAXQUITEDIT], rightEditSize = 0 ;
  16.  
  17. static char save[BUFSIZE], temp[BUFSIZE] ;
  18.  
  19. void initEdit()
  20. { Erase = erasechar() ;
  21.   Kill = killchar() ;
  22. #ifdef EDIT_LEFT
  23.   addLeftEdit(EDIT_LEFT) ;
  24. #endif
  25. #ifdef EDIT_RIGHT
  26.   addRightEdit(EDIT_RIGHT) ;
  27. #endif
  28. }
  29.  
  30. void emptyQuitEdit() { quitEditSize = 0 ; }
  31.  
  32. int addQuitEdit(n)
  33. int n ;
  34. { if ( inQuitEdit(n) ) return 1 ;
  35.   if ( quitEditSize >= MAXQUITEDIT ) return(0) ;
  36.   quitEdit[quitEditSize++] = n ;
  37.   return(1) ;
  38. }
  39.  
  40. int inQuitEdit(n)
  41. int n ;
  42. { int i ;
  43.   for ( i = 0 ; i < quitEditSize ; i++ ) if ( quitEdit[i] == n ) return(1) ;
  44.   return(0) ;
  45. }
  46.  
  47. void emptyLeftEdit() { leftEditSize = 0 ; }
  48.  
  49. int addLeftEdit(n)
  50. int n ;
  51. { if ( inLeftEdit(n) ) return 1 ;
  52.   if ( leftEditSize >= MAXQUITEDIT ) return(0) ;
  53.   leftEdit[leftEditSize++] = n ;
  54.   return(1) ;
  55. }
  56.  
  57. int inLeftEdit(n)
  58. int n ;
  59. { int i ;
  60.   for ( i = 0 ; i < leftEditSize ; i++ ) if ( leftEdit[i] == n ) return(1) ;
  61.   return(0) ;
  62. }
  63.  
  64. void emptyRightEdit() { rightEditSize = 0 ; }
  65.  
  66. int addRightEdit(n)
  67. int n ;
  68. { if ( inRightEdit(n) ) return 1 ;
  69.   if ( rightEditSize >= MAXQUITEDIT ) return(0) ;
  70.   rightEdit[rightEditSize++] = n ;
  71.   return(1) ;
  72. }
  73.  
  74. int inRightEdit(n)
  75. int n ;
  76. { int i ;
  77.   for ( i = 0 ; i < rightEditSize ; i++ ) if ( rightEdit[i] == n ) return(1) ;
  78.   return(0) ;
  79. }
  80.  
  81. void showline (line,cp,win,ystart,xstart,xlen,rep)
  82. char *line ;
  83. int cp ;
  84. WINDOW* win ;
  85. int ystart,xstart,xlen ;
  86. char rep[4] ;
  87. { int ll = strlen(line) ;
  88.   int i, h = xlen/2 ;
  89.   char lc, lo, ro, rc ;
  90.  
  91.   lc = rep[0] ;
  92.   lo = rep[1] ;
  93.   ro = rep[2] ;
  94.   rc = rep[3] ;
  95.  
  96.   wmove(win,ystart,xstart) ;
  97.  
  98.   if ( (ll <= xlen) && (cp < xlen) )
  99.     { waddch(win,lc) ;
  100.       for (i=0 ; i<=ll-1 ; i++)
  101.     waddch(win,line[i]) ;
  102.       for (i=ll ; i<xlen ; i++)
  103.     waddch(win,' ') ;
  104.       waddch(win,rc) ;
  105.       wmove(win,ystart,xstart+1+cp) ;
  106.     }
  107.   else if ( (ll == xlen) && (cp == xlen) )
  108.     { waddch(win,lo) ;
  109.       for (i=1 ; i<=ll-1 ; i++)
  110.     waddch(win,line[i]) ;
  111.       waddch(win,' ') ;
  112.       waddch(win,rc) ;
  113.       wmove(win,ystart,xstart+1+cp-1) ;
  114.     }
  115.   else /* ll > xlen */
  116.   if ( cp < h+1 )
  117.     { waddch(win,lc) ;
  118.       for (i=0 ; i<xlen ; i++)
  119.     waddch(win,line[i]) ;
  120.       waddch(win,ro) ;
  121.       wmove(win,ystart,xstart+1+cp) ;
  122.     }
  123.   else if ( cp < ll-xlen+h )
  124.     { waddch(win,lo) ;
  125.       for (i=cp-h ; i<=cp-h+xlen-1 ; i++)
  126.     waddch(win,line[i]) ;
  127.       waddch(win,ro) ;
  128.       wmove(win,ystart,xstart+1+h) ;
  129.     }
  130.   else if ( cp < ll )
  131.     { waddch(win,lo) ;
  132.       for (i=ll-xlen ; i<=ll-1 ; i++)
  133.     waddch(win,line[i]) ;
  134.       waddch(win,rc) ;
  135.       wmove(win,ystart,xstart+1+cp-ll+xlen) ;
  136.     }
  137.   else /* cp == ll */
  138.     { waddch(win,lo) ;
  139.       for (i=ll-xlen+1 ; i<=ll-1 ; i++)
  140.     waddch(win,line[i]) ;
  141.       waddch(win,' ') ;
  142.       waddch(win,rc) ;
  143.       wmove(win,ystart,xstart+1+xlen-1) ;
  144.     }
  145.   wrefresh(win) ;
  146. }
  147.  
  148. void doCurRight(ll,cp)
  149. int *ll,*cp ;
  150. { if ( *cp < *ll )
  151.     (*cp)++ ;
  152.   else
  153.     BEEP() ;
  154. }
  155.  
  156. void doCurLeft(ll,cp)
  157. int *ll,*cp ;
  158. { if ( *cp > 0 )
  159.     (*cp)-- ;
  160.   else
  161.     BEEP() ;
  162. }
  163.  
  164. doErase(line,ll,cp)
  165. char *line ;
  166. int *ll,*cp ;
  167. { int i ; 
  168.  
  169.   if (*ll == 0 || *cp == 0)
  170.     { strcpy(temp,line) ;
  171.       strcpy(line,save) ;
  172.       strcpy(save,temp) ;
  173.       *ll = strlen(line) ;
  174.       *cp = 0 ;
  175.     }
  176.   else
  177.     { for (i=(*cp)-1 ; i<*ll ; i++)
  178.         line[i] = line[i+1] ;
  179.       (*ll)-- ;
  180.       (*cp)-- ;
  181.     }
  182. }
  183.  
  184. void doDel(line,ll,cp)
  185. char *line ;
  186. int *ll,*cp ;
  187. { int i ; 
  188.   
  189.   if (*ll == 0)
  190.     BEEP() ;
  191.   if (*cp == *ll)
  192.     doCurLeft(ll,cp) ;
  193.   else
  194.     { for (i = *cp ; i < *ll ; i++)
  195.         line[i] = line[i+1] ;
  196.       (*ll)-- ;
  197.       if ( *cp > *ll )
  198.         *cp = *ll ;
  199.     }
  200. }
  201.  
  202. void doInsert(line,maxlinelen,ll,cp,c)
  203. char *line ;
  204. int *ll, *cp, c ;
  205. { int i ;
  206.  
  207.   if (*ll > maxlinelen)
  208.     BEEP() ;
  209.   else
  210.     for (i = *ll ; i >= *cp ; i--)
  211.       line[i+1] = line[i] ;
  212.     line[*cp] = c ;
  213.     (*cp)++ ;
  214.     (*ll)++ ;
  215. }
  216.  
  217. void editCom (line,maxLineLen,linelen,curpos,c)
  218. char *line ;
  219. int maxLineLen, *linelen, *curpos ;
  220. int c ;
  221. { if ( c == Kill )
  222.     doDel(line,linelen,curpos) ;
  223.   else if ( c == Erase )
  224.     doErase(line,linelen,curpos) ;
  225.   else if ( inRightEdit(c) )
  226.     doCurRight(linelen,curpos) ;
  227.   else if ( inLeftEdit(c) )
  228.     doCurLeft(linelen,curpos) ;
  229.   else if ( (c < 32) || (c > 127) )
  230.     BEEP() ;
  231.   else
  232.     doInsert(line,maxLineLen,linelen,curpos,c) ;
  233. }
  234.  
  235. int editline (line,maxlinelen,curpos,win,ystart,xstart,xlen,rep)
  236. char *line ;
  237. int maxlinelen, *curpos ;
  238. WINDOW *win ;
  239. int ystart, xstart, xlen ;
  240. char *rep ;
  241. { int linelen = strlen(line) ;
  242.   int c ;
  243.  
  244.   if ( ! initialized ) { initEdit() ; initialized = 1 ; }
  245.  
  246.   strcpy(save,"") ;
  247.  
  248.   showline(line,*curpos,win,ystart,xstart,xlen,rep) ;
  249.  
  250.   for ( c=wgetchR(win)
  251.       ; ( c != EOF) && ( ! inQuitEdit(c) )
  252.       ; c=wgetchR(win)
  253.       )
  254.     { editCom(line,maxlinelen,&linelen,curpos,c) ;
  255.       showline(line,*curpos,win,ystart,xstart,xlen,rep) ;
  256.     }
  257.  
  258.   showline(line,0,win,ystart,xstart,xlen,rep) ;
  259.   return(c) ;
  260. }
  261.